// 水流，有方向  流分成四种   可读流，可写流， 双工流， 转化流 (流和文件没有关系)

// 文件模块继承了流，实现了可读流和可写流

// 可读流有4个方法 监听数据的到来 on('data')  on('end')  pause()  resume()

// 对于文件来说： on('open')   on('close')  on('error') -> fs.open  fs.close()
import fs from "fs";
import path from "path";
const rs = fs.createReadStream(path.resolve(import.meta.dirname, "pc.js"), {
  flags: "r",
  encoding: null, // 读取的数据是二进制的  utf8
  mode: 0o666,
  autoClose: true,
  emitClose: true,
  start: 0,
  end: 10,
  highWaterMark: 10,
});
// 将水管打开，从非流动模式变为流动模式
rs.on("open", function (fd) {
  console.log(fd, "rfd"); // fs.open
});
rs.on("data", function (data) {
  console.log(data); // fs.read
  rs.pause(); // 可以将读取到的内容 写入到文件中
});
rs.on("end", function () {
  console.log("end");
});
rs.on("close", function () {
  console.log("close"); // fs.close
});

// setInterval(() => {
//   rs.resume(); // 写的操作
// }, 1000);

// 可写流 write() 写入  end() 写完后关闭这个流   on('drain') 当写入完成后调用的回调

const ws = fs.createWriteStream(
  path.resolve(import.meta.dirname, "pc-copy.js"),
  {
    flags: "w",
    mode: 0o666,
    autoClose: true,
    emitClose: true,
    start: 0,
    highWaterMark: 3, // 我希望写入的时候只用10个字节内存, 如果超过10个 会告诉你有淹没可用内存的风险
  }
);

ws.on("open", function (wfd) {
  console.log(wfd, "wfd");
});

let flag = ws.write("1", function () {
  console.log("ok1");
}); // flag 意味着你不要再给我了，再给我就超过预期了
flag = ws.write("2", function () {
  console.log("ok2");
});

ws.on("drain", function () {
  console.log("drain"); // 控制速度的
});
ws.end("遗言");

ws.on("close", function () {
  console.log("close");
});
ws.on("error", function () {
  console.log("error");
});
console.log(flag); // flag 是给读取来用的
